package cn.topcode.unicorn.utils;

import org.springframework.context.MessageSource;
import org.springframework.web.servlet.support.RequestContext;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.*;

/**
 * 国际化辅助工具类
 * 包括文字的国际化处理方法、国际化的文字常量及格式化
 * @author Unicorn Lien
 * 2016年9月16日 下午5:01:10 创建
 */
public class I18nUtil {
    
    public static final String LANGUAGE_CHINESE = "zh-cn";
    public static final String LANGUAGE_ENGLISH = "en";
    
    /**
     * 根据language参数进行国际化
     * 在推送中使用
     * @author Unicorn Lien
     * 2016年9月16日 下午5:03:17 创建
     * @param code   国际化文字的键名（国际化文字常量）
     * @param language  语言（en/zh），空或空字符串默认为zh
     * @param params    文本格式化处理的填充参数
     * @return  国际化结果字符串
     */
    @Deprecated
	public static String getMessage(String code, String language, Object ... params) {
	    return getMessage(code, new Locale(language), params);
    }

	/**
	 * 根据language参数进行国际化
	 * 在推送中使用
	 * @author Unicorn Lien
	 * 2016年9月16日 下午5:03:17 创建
	 * @param code   国际化文字的键名（国际化文字常量）
	 * @param locale  本地化，空或空字符串默认为zh-CN
	 * @param params    文本格式化处理的填充参数
	 * @return  国际化结果字符串
	 */
	public static String getMessage(String code, Locale locale, Object ... params) {
		return I18nHelper.getMessage(code, locale, params);
	}
	
	/**
	 * 根据HttpRequest进行国际化
	 * 在http请求响应中使用
	 * @author Unicorn Lien
	 * 2016年9月16日 下午5:05:35 创建
	 * @param request  请求
	 * @param code 国际化文字的键名（国际化文字常量）
	 * @param params   文本格式化处理的填充参数
	 * @return  国际化结果字符串
	 */
	public static String getMessage(HttpServletRequest request, String code, Object ... params) {
	    if(request == null)  throw new IllegalArgumentException("HttpRequest对象不能为空");
	    if(StringUtil.isBlank(code)) throw new IllegalArgumentException("国际化文字键名不能为空");
		RequestContext context = new RequestContext(request);
		String pattern = context.getMessage(code);
		return MessageFormat.format(pattern, params);
	}

	/**
	 * 对List进行国际化处理
	 * 需要配合I18n注解
	 * @param list		对象列表
	 * @param request		request对象
	 */
	public static void processAnnotation(List list,HttpServletRequest request) {
		for(Object obj : list) {
			processAnnotation(request,obj);
		}
	}

	/**
	 * 对bean对象进行国际化处理
	 * @param request		request对象
	 * @param obj	对象列表
	 */
	public static void processAnnotation(HttpServletRequest request, Object obj) {
		Class tempClass = obj.getClass();
		//当父类为null的时候说明到达了最上层的父类(Object类).
		while (tempClass != null) {
			processAnnotation(tempClass,obj,request);
			//得到父类,然后赋给自己
			tempClass = tempClass.getSuperclass();
		}
	}

	private static void processAnnotation(Class clazz, Object obj, HttpServletRequest request) {
		Field[] fields = clazz.getDeclaredFields();
		String className = clazz.getSimpleName();
		for(Field f : fields){
			f.setAccessible(true);
			if(!f.getType().equals(String.class)) {
				continue;
			}
			I18n i18n = f.getAnnotation(I18n.class);
			if(i18n != null){
				StringBuilder i18nKey = new StringBuilder();
				if(StringUtil.isNotBlank(i18n.value())) {
					i18nKey.append(i18n.value());
					i18nKey.append(".");
				}else {
					if(StringUtil.isNotBlank(i18n.module())) {
						i18nKey.append(i18n.module());
						i18nKey.append(".");
					}
					if(StringUtil.isNotBlank(i18n.domain())) {
						i18nKey.append(i18n.domain());
						i18nKey.append(".");
					}else {
						i18nKey.append(className);
						i18nKey.append(".");
					}
					if(StringUtil.isNotBlank(i18n.field())) {
						i18nKey.append(i18n.field());
						i18nKey.append(".");
					}else {
						i18nKey.append(f.getName());
						i18nKey.append(".");
					}
				}
				try {
					String value = (String) f.get(obj);
					i18nKey.append(value);
					String message = getMessage(request,i18nKey.toString());
					f.set(obj,message);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
